package com.bang.daybreak.common.excel;


import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.bang.daybreak.common.util.StringUtil;

import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;

/**
 * Excel 监听类，可以自定义
 *
 * @author : wdj
 * @since : 2019/3/14 0012 上午 10:46
 * @version 1.0
 */
public class ExcelListener extends AnalysisEventListener {

    //自定义用于暂时存储data。
    /**
     * 可以通过实例获取该值
     */
    private List<Object> datas = new ArrayList<>();

    /**
     * 通过 AnalysisContext 对象还可以获取当前 sheet，当前行等数据
     */
    @Override
    public void invoke(Object object, AnalysisContext context) {
        // 判断是否有空对象,如果存在空对象，过滤掉.
        boolean flag = checkObjFieldIsNull(object);
        if (!flag) {
            //数据存储到list，供批量处理，或后续自己业务逻辑处理。
            datas.add(object);
            //根据业务自行 do something
            doSomething();
        }

        /*
        如数据过大，可以进行定量分批处理
        if(datas.size()<=100){
            datas.add(object);
        }else {
            doSomething();
            datas = new ArrayList<Object>();
        }
         */

    }

    /**
     * 根据业务自行实现该方法
     */
    private void doSomething() {
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        /*
            datas.clear();
            解析结束销毁不用的资源
         */
    }

    public List<Object> getDatas() {
        return datas;
    }

    public void setDatas(List<Object> datas) {
        this.datas = datas;
    }

    /**
     * 判断对象中属性值是否全为空
     *
     * @param object
     * @return
     */
    public static boolean checkObjAllFieldsIsNull(Object object) {
        if (null == object) {
            return true;
        }

        try {
            for (Field f : object.getClass().getDeclaredFields()) {
                f.setAccessible(true);

                System.out.print(f.getName() + ":");
                System.out.println(f.get(object));

                if (f.get(object) != null && StringUtil.isNotBlank(f.get(object).toString())) {
                    return false;
                }

            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        return true;
    }

    /**
     * 判断该对象是否
     * @param obj
     * @return ture表示所有属性为null 返回false表示不是所有属性都是null
     * @throws Exception
     */
    private boolean checkObjFieldIsNull(Object obj) {
        //得到类对象
        Class stuCla = (Class) obj.getClass();
        //得到属性集合
        Field[] fs = stuCla.getDeclaredFields();
        boolean flag = true;
        //遍历属性
        try {
            for (Field f : fs) {
                //设置属性是可以访问的(私有的也可以)
                f.setAccessible(true);
                //得到此属性的值
                Object val = f.get(obj);
                //只要有1个属性不为空,那么就不是所有的属性值都为空
                if (val != null) {
                    flag = false;
                    break;
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return flag;
    }

}